package com.example.mysql.service.impl;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.example.mysql.mapper.UserMapper;
import com.example.mysql.entity.User;
import com.example.mysql.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import java.util.List;
import java.util.Map;

/**
 * 用户表(User)表服务实现类
 *
 * @author 龙茶清欢
 * @since 2024-09-24 15:58:42
 */
// 作者通常建议 @DS 放在serviceImpl的方法上，如事务注解一样。
@DS("slave")    // 使用 @DS 从 primary 指定的数据源切换到指定数据源
@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    /**
     * MyBatis-Plus 提供了一套强大的条件构造器（Wrapper），用于构建复杂的数据库查询条件。
     * Wrapper 类允许开发者以链式调用的方式构造查询条件，无需编写繁琐的 SQL 语句，从而提高开发效率并减少 SQL 注入的风险。
     * 使用参考 Mybatis-Plus 官网： https://baomidou.com/guides/wrapper/
     */


    /**
     * MyBatis-Plus 从 3.5.4 版本开始支持流式查询，这是 MyBatis 的原生功能，
     * 通过 ResultHandler 接口实现结果集的流式查询。这种查询方式适用于数据跑批或处理大数据的业务场景。
     * 使用参考 Mybatis-Plus 官网： https://baomidou.com/guides/stream-query/
     */


    public void streamQuery() {
        // 获取用户列表，并打印用户名
        baseMapper.selectList(null)
                .stream()
                .map(User::getUsername)
                .forEach(System.out::println);

        // MyBatis-Plus 的 Wrapper 类是构建复杂查询和更新条件的关键工具。它允许开发者以链式调用的方式构造 SQL 的 WHERE 子句，提供了极大的灵活性和便利性。

        // 推荐使用
        // LambdaQueryWrapper：这是一个基于 Lambda 表达式的查询条件构造器，它通过 Lambda 表达式来引用实体类的属性，从而避免了硬编码字段名。
        // 这种方式提高了代码的可读性和可维护性，尤其是在字段名可能发生变化的情况下。
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getUsername, "老王");
        // -- 普通 Wrapper 和 Lambda Wrapper 生成的 SQL 相同    SELECT * FROM user WHERE username = '老王'

        // LambdaUpdateWrapper：类似于 LambdaQueryWrapper，LambdaUpdateWrapper 是基于 Lambda 表达式的更新条件构造器。
        // 它允许你使用 Lambda 表达式来指定更新字段和条件，同样避免了硬编码字段名的问题。
        LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        lambdaUpdateWrapper.set(User::getUsername, "老李头");
        // -- 普通 Wrapper 和 Lambda Wrapper 生成的 SQL 相同    UPDATE user SET username = '老李头'

        // 创建 LambdaQueryWrapper
        LambdaQueryWrapper<User> lambdaQueryWrapper1 = Wrappers.lambdaQuery();
    }

    @Resource
    private JdbcTemplate jdbcTemplate;

    @DS("slave_1")
    public List selectByCondition() {
        return jdbcTemplate.queryForList("select * from user where age >10");
    }

}

